package com.billy.android.register

import com.android.build.api.artifact.ScopedArtifact
import com.android.build.api.variant.AndroidComponentsExtension
import com.android.build.api.variant.ScopedArtifacts
import com.android.build.gradle.AppPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
/**
 * 自动注册插件入口
 * @author billy.qi
 * @since 17/3/14 17:35
 */
public class RegisterPlugin implements Plugin<Project> {
    public static final String EXT_NAME = 'autoregister'

    @Override
    public void apply(Project project) {
        // 检查是否为 Android Application 或 Library 模块
        def androidComponents = project.getExtensions().findByType(AndroidComponentsExtension.class)
        if (androidComponents == null) {
            project.logger.warn("AutoRegister plugin requires Android Application or Library plugin.")
            return // 如果不是 Android 项目则不应用插件
        }

        // 创建配置扩展
        project.getExtensions().create(EXT_NAME, AutoRegisterConfig.class)

        // 在所有变体上注册 AutoRegisterTask
        androidComponents.onVariants(androidComponents.selector().all(), { variant ->
            println "project(${project.name}) apply auto-register plugin to variant: ${variant.name}"
            
            // 创建自定义 Task
            def taskProvider = project.tasks.register("${variant.name}AutoRegister", AutoRegisterTask) {
                // 配置会在 afterEvaluate 中设置
            }

            // 使用 Artifacts API 将 Task 连接到构建流程
            variant.artifacts
                    .forScope(ScopedArtifacts.Scope.ALL) // 处理项目和依赖的所有类
                    .use(taskProvider) // 将 Task 应用于 Classes artifact
                    .toTransform(
                            ScopedArtifact.CLASSES.INSTANCE, // 使用 INSTANCE 而不是类引用
                            { it.inputJars }, // 输入 JAR
                            { it.inputDirs }, // 输入目录
                            { it.output }     // 输出目录
                    )

            // 在 afterEvaluate 中读取和处理配置
            project.afterEvaluate { evaluatedProject ->
                AutoRegisterConfig config = evaluatedProject.getExtensions().findByName(EXT_NAME) as AutoRegisterConfig
                if (config != null) {
                    config.project = evaluatedProject
                    config.convertConfig()
                    // 将配置传递给 Task
                    taskProvider.configure { task ->
                        task.config.set(config)
                    }
                    evaluatedProject.logger.warn("Configured AutoRegister for variant: ${variant.name}")
                    evaluatedProject.logger.warn(config.toString())
                } else {
                    evaluatedProject.logger.warn("AutoRegister configuration not found.")
                }
            }
        })
    }
}
